package Client;

import java.io.*;
import java.net.Socket;
import java.util.Enumeration;
import java.util.Vector;

public class Protocole {
	///////////////////////////////////
	//Attributs						///
	///////////////////////////////////
	
	private Connection connection;
	private EnvoitDonnee envoitDonnee;
	private ReceptionDonnee receptionDonnee;
	
	///////////////////////////////////
	//Méthodes						///
	///////////////////////////////////
	
	//Constructeur
	public Protocole(Connection connection){
		this.connection=connection;
	}
	
	//affecte la socket utilisée par la connexion au flux d'entrée et de sortie
	private void affecterSocket(Socket socket){
		this.envoitDonnee= new EnvoitDonnee(this,socket);
		this.receptionDonnee= new ReceptionDonnee(this,socket);
	}
	
	//identification de l'utilisateur
	public void identification(String id,String mdp){
		//on ouvre la connexion
		Socket socket = connection.ouvrirConnection();
		//on affecte la socj=ket aux flux
		this.affecterSocket(socket);
        this.connection.setEtat(true);
        this.connection.demarrerAttente();
		//protocole d'identification
		this.envoitDonnee.ecrireEntier(1);
		this.envoitDonnee.ecrireChaine(id);
		this.envoitDonnee.ecrireChaine(mdp);
		//on traite le code retourné par le serveur
        
	}
	
	public void inscription(String id,String mdp){
		//on ouvre la connexion
		Socket socket = connection.ouvrirConnection();
		//on affecte la socj=ket aux flux
		this.affecterSocket(socket);
       		//protocole d'inscription
		this.envoitDonnee.ecrireEntier(2);
		this.envoitDonnee.ecrireChaine(id);
		this.envoitDonnee.ecrireChaine(mdp);
		//on traite le code retourné par le serveur
		//on referme la connection
        this.traiterCodeRetour();
		this.connection.fermerConnection();
	}
	
	
	
	public Vector<String> demanderListeConnectes(){
		Vector<String> liste = new Vector<String>();
		this.envoitDonnee.ecrireEntier(4);
		int taille = 0;
		try {
			taille = this.receptionDonnee.lireEntier();
		} catch (IOException e) {
			System.out.println("erreur de connexion");
		}
		 for (int i = 0; i < taille; i++) // parcours de la table des connectés
		    {
			 liste.addElement(this.receptionDonnee.lireChaine());
		    }
	
		 return liste;
		
	}
	

	public void envoitMessage(String id,String message){
		this.envoitDonnee.ecrireEntier(3);
		this.envoitDonnee.ecrireChaine(id);
		this.envoitDonnee.ecrireChaine(message);
		
	}
	
	public Vector<String> recevoirMessage(){
        Vector<String> liste = new Vector<String>();
        liste.addElement(this.receptionDonnee.lireChaine());
        liste.addElement(this.receptionDonnee.lireChaine());
		return liste;
	}
	
	public void traiterCodeRetour(){
		int coderetour = -1;
		try {
			coderetour = this.receptionDonnee.lireEntier();
		} catch (IOException e) {
			System.out.println("erreur de connexion lecture entier");
		}
		switch (coderetour){
        case 0: {
        	System.out.println("ok");
            break;
        }
        case -2: {
        	System.out.println("mauvais identifiant");
            this.connection.fermerConnection();
            break;
        }
        case -3: {
        	System.out.println("identifiant déjà existant");
            break;
        }
        case 3: {

            break;
        }
            case(4):{
                System.out.println("Nouvelle Communication");
                Vector<String> tab = new Vector<String>();
        tab = this.connection.recevoirMessage();
        System.out.print(tab.elementAt(0));
        System.out.println("dit");
        System.out.println(tab.elementAt(1));
            }
        default:
            break;
        } // switch
	}
   
}
